package com.aaa.forum.exception;

import com.aaa.forum.common.AppResult;
import com.aaa.forum.common.ResultCode;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

/**
 * 全局处理异常
 */
@Slf4j  // 用来打印日志
@ControllerAdvice
@ResponseBody   // 表示返回的是数据, 而不是静态页面
public class GlobalExceptionHandler {


    @ExceptionHandler(ApplicationException.class)   // 括号中是要处理的异常类型
    public AppResult applicationExceptionHandler  (ApplicationException e) {
        // 打印异常信息
        e.printStackTrace();
        // 打印日志信息
        log.error(e.getMessage());

        // 如果该异常携带了自定义错误信息, 就返回自定义错误信息
        if (e.getErrorResult() != null) return e.getErrorResult();

        // 如果具体的异常信息不为空, 返回具体的异常信息
        if (e.getMessage() != null && !e.getMessage().equals("")) return AppResult.failed(e.getMessage());

        // 返回 ResultCode.ERROR_SERVICES, 服务器内部错误
        return AppResult.failed(ResultCode.ERROR_SERVICES);
    }


    // 兜底的异常处理
    @ExceptionHandler(Exception.class)
    public AppResult exceptionHandler (Exception e) {
        // 打印异常信息
        e.printStackTrace();
        // 打印日志信息
        log.error(e.getMessage());

        // 如果具体的异常信息不为空, 返回具体的异常信息
        if (e.getMessage() != null && !e.getMessage().equals("")) return AppResult.failed(e.getMessage());

        // 返回 ResultCode.ERROR_SERVICES, 服务器内部错误
        return AppResult.failed(ResultCode.ERROR_SERVICES);
    }
}
